package com.linzm.leetcode.primary.exercises1_20230114;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author zimingl
 * @Date 2023/1/12 23:40
 * @Description: 找出 3 位偶数
 * 给你一个整数数组 digits ，其中每个元素是一个数字（0 - 9）。数组中可能存在重复元素。
 * 你需要找出 所有 满足下述条件且 互不相同 的整数：
 * 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
 * 该整数不含 前导零
 * 该整数是一个 偶数
 * 例如，给定的 digits 是 [1, 2, 3] ，整数 132 和 312 满足上面列出的全部条件。
 * 将找出的所有互不相同的整数按 递增顺序 排列，并以数组形式返回。
 * <p>
 * 做法：100-1000 遍历， 两个map 比较value值大小
 */
public class Demo3_2094 {
    public static void main(String[] args) {
//        int[] digits = new int[]{2, 2, 8, 8, 2};
        int[] digits = new int[]{2, 3, 8, 8, 2};
        Demo3_2094 demo32094 = new Demo3_2094();
        int[] evenNumbers = demo32094.findEvenNumbers(digits);
        String[] strings = Arrays.stream(evenNumbers).mapToObj(String::valueOf).toArray(String[]::new);
        System.out.println(String.join(" ", strings));
    }

    public int[] findEvenNumbers(int[] digits) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : digits) {
            int count = map.getOrDefault(num, 0) + 1;
            map.put(num, count);
        }
        TreeSet<Integer> res = new TreeSet<>();
        String tmpStr;
        for (int i = 228; i < 1000; i++) {
            if (i % 2 == 0) {
                Map<Integer, Integer> numMap = new HashMap<>();
                copyMap(numMap, map);
                tmpStr = String.valueOf(i);
                int count = 0;
                for (int j = 0; j < tmpStr.length(); j++) {
                    if (map.keySet().contains(tmpStr.charAt(j) - 48)
                            && map.get(tmpStr.charAt(j) - 48) > numMap.get(tmpStr.charAt(j) - 48)) {
                        numMap.put(tmpStr.charAt(j) - 48, numMap.get(tmpStr.charAt(j) - 48) + 1);
                        count++;
                    }
                    if (count == 3) {
                        res.add(i);
                        count = 0;
                    }
                }
            }
        }
        return res.stream().sorted().mapToInt(x -> x).toArray();
    }

    private void copyMap(Map<Integer, Integer> numMap, Map<Integer, Integer> map) {
        for (Integer num : map.keySet()) {
            numMap.put(num, 0);
        }
    }

    private static boolean isRepeated(Map<Integer, Integer> map) {
        List<Integer> list = map.values().stream().filter(x -> x > 1).collect(Collectors.toList());
        return list.size() != 0;
    }

    public int[] findEvenNumbers2(int[] digits) {
        boolean exsit[] = new boolean[1005];
        for (int i = 0; i < digits.length; i++) {
            for (int j = 0; j < digits.length; j++) {
                for (int k = 0; k < digits.length; k++) {
                    if (i != j && j != k && i != k) {
                        exsit[100 * digits[i] + 10 * digits[j] + digits[k]] = true;
                    }
                }
            }
        }
        List<Integer> list = new ArrayList<>();
        for (int i = 100; i < 1000; i += 2) {
            if (exsit[i]) {
                list.add(i);
            }
        }
        int ans[] = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }
}
